package Leetcode.每日一题;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: kirito
 * @Date: 2024/5/12 13:51
 * @Description:
 * 吃掉 N 个橘子的最少天数
 * 困难
 * 相关标签
 * 相关企业
 * 提示
 * 厨房里总共有 n 个橘子，你决定每一天选择如下方式之一吃这些橘子：
 *
 * 吃掉一个橘子。
 * 如果剩余橘子数 n 能被 2 整除，那么你可以吃掉 n/2 个橘子。
 * 如果剩余橘子数 n 能被 3 整除，那么你可以吃掉 2*(n/3) 个橘子。
 * 每天你只能从以上 3 种方案中选择一种方案。
 *
 * 请你返回吃掉所有 n 个橘子的最少天数。
 *
 *
 *
 * 示例 1：
 *
 * 输入：n = 10
 * 输出：4
 * 解释：你总共有 10 个橘子。
 * 第 1 天：吃 1 个橘子，剩余橘子数 10 - 1 = 9。
 * 第 2 天：吃 6 个橘子，剩余橘子数 9 - 2*(9/3) = 9 - 6 = 3。（9 可以被 3 整除）
 * 第 3 天：吃 2 个橘子，剩余橘子数 3 - 2*(3/3) = 3 - 2 = 1。
 * 第 4 天：吃掉最后 1 个橘子，剩余橘子数 1 - 1 = 0。
 * 你需要至少 4 天吃掉 10 个橘子。
 * 示例 2：
 *
 * 输入：n = 6
 * 输出：3
 * 解释：你总共有 6 个橘子。
 * 第 1 天：吃 3 个橘子，剩余橘子数 6 - 6/2 = 6 - 3 = 3。（6 可以被 2 整除）
 * 第 2 天：吃 2 个橘子，剩余橘子数 3 - 2*(3/3) = 3 - 2 = 1。（3 可以被 3 整除）
 * 第 3 天：吃掉剩余 1 个橘子，剩余橘子数 1 - 1 = 0。
 * 你至少需要 3 天吃掉 6 个橘子。
 * 示例 3：
 *
 * 输入：n = 1
 * 输出：1
 * 示例 4：
 *
 * 输入：n = 56
 * 输出：6
 *
 *
 * 提示：
 *
 * 1 <= n <= 2*10^9
 */


public class minDays {
    public static void main(String[] args) {
        int n = 10;
        System.out.println(new minDays().minDays(n));
    }
    Map<Integer, Integer> memo = new HashMap<Integer, Integer>();

    /**
     * 有一个运算规律的 并不是单纯的先除以3 除以2 然后减
     * https://leetcode.cn/problems/minimum-number-of-days-to-eat-n-oranges/solutions/2773476/liang-chong-fang-fa-ji-yi-hua-sou-suo-zu-18jv/?envType=daily-question&envId=2024-05-12
     * @param n
     * @return
     */
    public int minDays2(int n) {
        if (n <= 1) {
            return n;
        }
        if (memo.containsKey(n)) {
            return memo.get(n);
        }
        memo.put(n, Math.min(n % 2 + 1 + minDays2(n / 2), n % 3 + 1 + minDays2(n / 3)));
        return memo.get(n);
    }
    /**
     * 模拟   好像不能这么简单的模拟
     * 模拟是不是会超时？
     * @param n
     * @return
     */
    public int minDays(int n) {
        int ans = 0;
        while (n > 0) {
            if (n % 3 == 0) {
                n -= 2 * (n / 3);
            } else if (n % 2 == 0) {
                n -= n / 2;
            }else{
                n--;
            }
            System.out.println(n);
            ans++;
            if (n == 0) {
                break;
            }
        }

        return ans;
    }





}
